<?php


namespace app\utils\redis;


class RedisCache {
    /// 写操作

    /**
     * Set写入操作
     * @param int $db
     * @param string $key
     * @param $value
     * @param int|null $timeOut
     */
    public static function wSetAdd(int $db, string $key, $value, int $timeOut = null)
    {
        // 如果过期时间不为null,且key不存在，则设置key的过期时间
        if($timeOut!==null && !self::rFindKey($db, $key)){
            RedisObj::getInstance($db)->expire($key, $timeOut);
        }
        return RedisObj::getInstance($db)->sAdd($key, $value);
    }


    /**
     * 根据Key设置Value
     * @param int $db
     * @param string $key
     * @param $value
     * @param null $timeOut 过期时间
     * @return bool
     */
    public static function wSetValue(int $db, string $key, $value, $timeOut=null) {
        return RedisObj::getInstance($db)->setex($key, $timeOut, $value);
    }

    /// 查操作

    /**
     * 在Set中查找是否存在指定value
     * @param int $db
     * @param string $key
     * @param $findValue
     * @return bool
     */
    public static function rFindInSet(int $db, string $key, $findValue) {
        return RedisObj::getInstance($db)->sIsMember($key, $findValue);
    }


    /**
     * 根据Key查找对应的value
     * @param int $db
     * @param string $key
     * @return bool|mixed|string
     */
    public static function rGetValue(int $db, string $key) {
        return RedisObj::getInstance($db)->get($key);
    }

    /**
     * 根据前缀查找keys
     * @param int $db
     * @param string $prefix
     * @return array
     */
    public static function rFindKeysByPrefix(int $db, string $prefix) {
        return RedisObj::getInstance($db)->keys($prefix.'*');
    }


    /**
     * 判断key是否存在
     * @param int $db
     * @param string $key
     * @return bool|int
     */
    public static function rFindKey(int $db, string $key) {
        return RedisObj::getInstance($db)->exists($key);
    }

    /**
     * 获取set长度
     * @param $db
     * @param $key
     * @return int
     */
    public static function rSetLen($db, $key):int
    {
        return RedisObj::getInstance($db)->sCard($key);
    }


    /// 删除

    /**
     * 根据key删除value
     * @param int $db
     * @param $keys array | string
     * @return int
     */
    public static function dDeleteKey(int $db, $keys) {
        return RedisObj::getInstance($db)->del($keys);
    }
}